PHP 和 MySQL 的互動 1 : 連線


Posted by tzutzu858 on 2020-09-03

概述: 連線 --> query(SQL) --> 讀取

step 0. 連線不要直接寫在程式碼,用另一個檔案來連

可以另外用一個檔案來寫連接,php 檔案加個 require_once('conn.php'); 就可以了

include、require、include_once、require_once 的差別

  • 相同 :
    都是引入或匯入檔案

  • 差別 :
    後面有 once 的就是只有匯入一次,如果沒有使用後面有 once ,那可能會將同一個檔案匯入兩次,便會發生錯誤

而 include 和 require 的差別在於,include 的檔案沒有被找到,程式依舊會執行,所以像是留言板作業,我們要匯入資料庫的帳號密碼,由於一定要匯入所以使用 require,同時也避免重複輸入造成錯誤,所以會使用 require_once '檔案名稱';


安全性問題 : 如果放的程式有帳密,一旦放到 git 很難真的清乾淨,所以建議要把 conn.php 這個檔案放到 .gitignore

補充說明 : 同學把有帳密的檔案 push 到 GitHub 上面,解決後寫一篇[ 狀況題 ] 如何徹底將檔案從 Git 中移除?,跟之前另一個同學想要找回消失的 commit 剛好相反 : 刪除了 branch 將 commit 資料也刪除了~怎麼辦!!!

我......好像也做過一樣的蠢事過 Orz

step 1. connection : mysqli()連 IP 帳密和 table --> 屬性 query 設定編碼和時間

物件存取屬性是用 -> 來表示
mysqli->query : 對資料庫執行一次查詢

// conn.php 檔
<?php
$server_name = 'localhost';
$username = 'huli';
$password = 'huli';
$db_name = 'huli';

$conn = new mysqli($server_name, $username, $password, $db_name);
// conn 為 connection 的簡寫,第一個參數是 server 名稱,第二個是帳號,第三個是密碼,第四個是 database
if ($conn->connect_error) { // 物件存取屬性是用 -> 來表示
  die('資料庫連線錯誤:' . $conn->connect_error);
}

//連線完要加上下面這兩行,編碼跟時區比較不會有問題
$conn->query('SET NAMES UTF8'); // 設定編碼
$conn->query('SET time_zone = "+8:00"'); // 設定台灣時間
?>

以下出自於這篇文章 : https://www.itread01.com/content/1543564392.html

什麼是 mysqli

PHP-MySQL 函式庫是 PHP 操作 MySQL 資料庫最原始的擴充套件庫,PHP-MySQLi 的 i 代表 Improvement ,相當於前者的增強版,也包含了相對進階的功能,另外本身也增加了安全性,比如可以大幅度減少 SQL 注入等問題的發生。

mysql 與 mysqli 的概念相關

(1)mysql 與 mysqli 都是 php 方面的函式集,與 mysql 資料庫關聯不大。

(2)在 php5 版本之前,一般是用 php 的 mysql 函式去驅動 mysql 資料庫的,比如mysql_query()的函式,屬於面向過程

(3)在php5版本以後,增加了 mysqli 的函式功能,某種意義上講,它是 mysql 系統函式的增強版,更穩定更高效更安全,與 mysql_query()對應的有 mysqli_query(),屬於面向物件,用物件的方式操作驅動mysql資料庫。

mysql 與 mysqli 的主要區別

(1)首先兩個函式都是用來處理 DB 的。

(2)mysqli 連線是永久連線,而 mysql 是非永久連線。什麼意思呢? mysql 連線每當第二次使用的時候,都會重新開啟一個新的程序,而 mysqli 則只使用同一個程序,這樣可以很大程度的減輕伺服器端壓力。

(3)mysqli 封裝了諸如事務等一些高階操作,同時封裝了 DB 操作過程中的很多可用的方法。應用比較多的地方是 mysqli 的事務。


step 2. query (SQL 語句)後用 fetch_assoc() 讀取資料

在SQL的資料讀取中,有三種不同的函數可以使用,分別是:

  1. fetch_array():將讀出的資料同時以數字與欄位名稱各自存一次在陣列之中,相當於同一個值會出現兩次。
    array(
      [0] => 'hi'
      [say] => 'hi'
      [1] => 'tzutzu'
      [Name] => 'tzutzu'
    )
    
  2. fetch_assoc():將讀出的資料Key值設定為該欄位的欄位名稱。
    array(
      [say] => 'hi'
      [Name] => 'tzutzu'
    )
    
  3. fetch_row():將讀出的資料Key值設定為依序下去的數字。
    array(
      [0] => 'hi'
      [1] => 'tzutzu'
    )
    

文章參考 :

  1. [PHP][MySQL] 從MySQL取得資料 – fetch_array、fetch_assoc、fetch_row
  2. PHP MySQLi Functions : MySQLi 蠻多方法的,下面放上程式碼會用到的三個方法
  3. mysqli query() performs a query against a database.
  4. mysqli error() returns the last error description for the most recent function call, if any.
  5. mysqli fetch_assoc() Fetch a result row as an associative array
<?php
require_once('conn.php');

  $result = $conn->query("SELECT * FROM users");  
  // 也可以寫 $result = mysqli_query($conn,"SELECT * FROM users");
  if (!$result) {
    die($conn->error);
  }

  while ($row = $result->fetch_assoc()) {
    echo "id:" . $row['id'] . '<br>'; // 就像是把物件的 key 拿出來,印出 key 的 value
    echo "username:" . $row['username'] . '<br>';
  }
?>

在 php5 版本以後,增加了 mysqli 的函數功能,某種意義上講,它是 mysql 系統函數的增強版,更穩定更高效更安全,與mysql_query() 對應的有 mysqli_query(),屬於面向對象,用對象的方式操作驅動 mysql 數據庫











Related Posts

How to solve the perpetual loading issue in Evernote? Evernote 一直轉圈圈的解決辦法

How to solve the perpetual loading issue in Evernote? Evernote 一直轉圈圈的解決辦法

基礎格線觀念 筆記

基礎格線觀念 筆記

[Notes] Git How to Step by Step: windows

[Notes] Git How to Step by Step: windows


Comments